package br.skytef.stmanager.beans;

import java.io.IOException;
import java.sql.SQLException;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import jxl.read.biff.BiffException;

import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import br.skytef.stmanager.daos.ClienteDAO;
import br.skytef.stmanager.daos.ControlPlanilhaDAO;
import br.skytef.stmanager.daos.DivergenciaClienteDao;
import br.skytef.stmanager.daos.ErroPlanilhaDAO;
import br.skytef.stmanager.daos.ProdutoClienteDao;
import br.skytef.stmanager.entities.ClienteEntity;
import br.skytef.stmanager.entities.ControlPlanilhasEntity;
import br.skytef.stmanager.entities.DivergenciaClienteEntity;
import br.skytef.stmanager.entities.ErroPlanilhaEntity;
import br.skytef.stmanager.entities.ParceiroEntity;
import br.skytef.stmanager.entities.ProdutoClienteEntity;
import br.skytef.stmanager.utils.Data;
import br.skytef.stmanager.utils.PlanGsurf;
import br.skytef.stmanager.utils.PlanLyra;
import br.skytef.stmanager.utils.PlanSE;

/**
 * Class ImportarVPN Controller
 */

@ManagedBean(name="ImportarVPNBean")
@SessionScoped
public class ImportarVPNBean {

	/**
	 * Campos com seus respactivos Getters e Setters.
	 */
	public ParceiroEntity parceiroPlan; 
	public ParceiroEntity getParceiroPlan() {return parceiroPlan;}
	public void setParceiroPlan(ParceiroEntity parceiroPlan) {this.parceiroPlan = parceiroPlan;}

	public RequestContext getContext() {return context;}
	public void setContext(RequestContext context) {this.context = context;}
	private RequestContext context;

	static PlanLyra  planilhaL;
	static PlanGsurf planilhaG;
	static PlanSE planilhaS;
	private ControlPlanilhasEntity cp;
	/**
	 * Construtor
	 * @throws IOException
	 */
	public ImportarVPNBean() throws IOException {
		super();
	}
	/**
	 * Método para importação das planilhas.
	 * @param fileUploadEvent
	 * @throws IOException
	 * @throws BiffException
	 * @throws SQLException 
	 */

	public void doUpload (FileUploadEvent fileUploadEvent) throws IOException, BiffException, SQLException{
		UploadedFile uploadedFile = fileUploadEvent.getFile();
		String fileNameUploaded = uploadedFile.getFileName();
		int ult = fileNameUploaded.length()-1;
		if(fileNameUploaded.charAt(ult) =='s' &&
				fileNameUploaded.charAt(ult-1) =='l' &&
				fileNameUploaded.charAt(ult-2) =='x' &&
				fileNameUploaded.charAt(ult-3) =='.'){
			planilhaL = new PlanLyra(uploadedFile.getInputstream());
			planilhaG = new PlanGsurf(uploadedFile.getInputstream());
			planilhaS = new PlanSE(uploadedFile.getInputstream());
			if (planilhaL.validar()){
				cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				if (cp == null){
					cp = new ControlPlanilhasEntity(fileNameUploaded, planilhaL.qtlinha(), 0, new Data().DtTime());
					new ControlPlanilhaDAO().inserir(cp);
					cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				}
				new ErroPlanilhaDAO().delete(cp.getIdcontrolPlanilha());
				for(int i=1; i < planilhaL.qtlinha(); i++){
					planilhaL.importarlinha(i);
					ClienteEntity cliente = new ClienteDAO().buscarCliente(planilhaL.getCnpj());
					if(cliente != null){
						cliente.setValorLyra(planilhaL.getValorPonto());
						new ClienteDAO().alterar(cliente);
						ProdutoClienteEntity prodCliente = new ProdutoClienteDao().localizar(cliente.getIdCliente());
						if(prodCliente != null){
							prodCliente.setTipoVpn("Lyra");
							prodCliente.setSerial(planilhaL.getSerial());
							new ProdutoClienteDao().alterar(prodCliente);
						}
						new DivergenciaClienteDao().excluir(cliente.getIdCliente());
						if(planilhaL.getValorPonto() >= cliente.getValorFaturado()){
							divergencia(fileNameUploaded, planilhaS.getValor(), cliente.getIdCliente(), "divgValor");
						}
					}else{
						cp.setErros(cp.getErros() + 1);
						cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
						new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(cp.getIdcontrolPlanilha(), PlanLyra.getLinhaErrada()));
					}
				}	
				new ControlPlanilhaDAO().alterar(cp);
				long fileSizeUploaded = uploadedFile.getSize(); 
				String infoAboutFile = "<br/> Arquivo recebido: <b>"+fileNameUploaded +"</b><br/>"+ "Tamanho do Arquivo: <b>"+fileSizeUploaded+"</b>";
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", infoAboutFile));
			}else if (planilhaG.validar()){
				cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				if (cp == null){
					cp = new ControlPlanilhasEntity(fileNameUploaded, planilhaG.qtlinha(), 0, new Data().DtTime());
					new ControlPlanilhaDAO().inserir(cp);
					cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				}
				new ErroPlanilhaDAO().delete(cp.getIdcontrolPlanilha());
				for(int i=1; i < planilhaG.qtlinha(); i++){
					planilhaG.importarlinha(i);
					ClienteEntity cliente = new ClienteDAO().buscarCliente(planilhaG.getCnpj());
					if(cliente != null){
						if(planilhaG.getCidade() != null)
							cliente.setCidade(planilhaG.getCidade());
						if(planilhaG.getUf() != null)
							cliente.setUf(planilhaG.getUf());
						if(planilhaG.getPolitica() != null)
							cliente.setPolitica(planilhaG.getPolitica());
						if(planilhaG.getCategoria() != null)
							cliente.setCategoria(planilhaG.getCategoria());
						if(cliente.getValorGSurf() != planilhaG.getValorMensal() && planilhaG.getValorMensal() != 0)
							cliente.setValorGSurf(planilhaG.getValorMensal());
						new ClienteDAO().alterar(cliente);
						ProdutoClienteEntity prodCliente = new ProdutoClienteDao().localizar(cliente.getIdCliente());
						if(prodCliente != null){
							prodCliente.setTerminal(planilhaG.getTerminal());
							prodCliente.setTipoVpn("GSurf");
							new ProdutoClienteDao().alterar(prodCliente);
						}
						new DivergenciaClienteDao().excluir(cliente.getIdCliente());
						if(planilhaG.getValorMensal() >= cliente.getValorFaturado()){
							divergencia(fileNameUploaded, planilhaS.getValor(), cliente.getIdCliente(), "divgValor");
						}
					}else{
						cp.setErros(cp.getErros() + 1);
						cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
						new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(cp.getIdcontrolPlanilha(), PlanGsurf.getLinhaErrada()));
					}
				}	
				new ControlPlanilhaDAO().alterar(cp);
				long fileSizeUploaded = uploadedFile.getSize(); 
				String infoAboutFile = "<br/> Arquivo recebido: <b>"+fileNameUploaded +"</b><br/>"+ "Tamanho do Arquivo: <b>"+fileSizeUploaded+"</b>";
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", infoAboutFile));

			}else if (planilhaS.validar()){
				cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				if (cp == null){
					cp = new ControlPlanilhasEntity(fileNameUploaded, planilhaS.qtlinha(), 0, new Data().DtTime());
					new ControlPlanilhaDAO().inserir(cp);
					cp = new ControlPlanilhaDAO().buscar(fileNameUploaded);
				}
				new ErroPlanilhaDAO().delete(cp.getIdcontrolPlanilha());
				for(int i=1; i < planilhaS.qtlinha(); i++){
					planilhaS.importarlinha(i);
					ClienteEntity cliente = new ClienteDAO().buscarCliente(planilhaS.getCnpj());
					if(cliente != null){
						new DivergenciaClienteDao().excluir(cliente.getIdCliente());
						if(planilhaS.getValor() >= cliente.getValorFaturado()){
							divergencia(fileNameUploaded, planilhaS.getValor(), cliente.getIdCliente(), "divgValor");
						}else if(planilhaS.getQtdLoja() != cliente.getQtdLojas()){
							divergencia(fileNameUploaded, planilhaS.getValor(), cliente.getIdCliente(), "divgLojas");
						}
						cliente.setValorSE(planilhaS.getValor());
						new ClienteDAO().alterar(cliente);
					}else{
						cp.setErros(cp.getErros() + 1);
						cp.setLinhasImportadas(cp.getLinhasImportadas() - 1);
						new ErroPlanilhaDAO().inserir(new ErroPlanilhaEntity(cp.getIdcontrolPlanilha(), PlanSE.getLinhaErrada()));
					}
				}	
				new ControlPlanilhaDAO().alterar(cp);
				long fileSizeUploaded = uploadedFile.getSize(); 
				String infoAboutFile = "<br/> Arquivo recebido: <b>"+fileNameUploaded +"</b><br/>"+ "Tamanho do Arquivo: <b>"+fileSizeUploaded+"</b>";
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Sucesso", infoAboutFile));

			}else{
				FacesContext facesContext = FacesContext.getCurrentInstance(); 
				facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Falha" , "planilha invália!"));
			}

		}else{
			FacesContext facesContext = FacesContext.getCurrentInstance(); 
			facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Falha", "Formato de arquivo inválido"));
		}
	}

	private void divergencia(String plan, double valor, int cliente, String tipo){
		DivergenciaClienteEntity DCE = new DivergenciaClienteDao().buscar(cliente);
		if(DCE != null){
			DCE.setNomePlanilha(plan);
			DCE.setValor(valor);
			DCE.setData_divergencia(new Data().DtTime());
			DCE.setTipo(tipo);
		}else{
			DCE = new DivergenciaClienteEntity(plan, valor, tipo, new Data().DtTime(), cliente);
			new DivergenciaClienteDao().inserir(DCE);
		}
	}
}
